package pl.un4giv3n.mightvsmagic.action;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import pl.un4giv3n.mightvsmagic.entity.Item;
import pl.un4giv3n.mightvsmagic.entity.User;
import pl.un4giv3n.mightvsmagic.utils.ItemUtil;

/**
 * @author andrzejewskia
 * equips/dequips selected item
 */
public class EquipItemAction extends PersistenceAction {

	private static final long serialVersionUID = 1L;
	/**
	 * session user
	 */
	private User user;
	/**
	 * equiped/dequiped item id
	 */
	private long itemId;

	/*
	 * (non-Javadoc)
	 * 
	 * @see pl.un4giv3n.mightvsmagic.action.PersistenceAction#execute()
	 */
	@Override
	public String execute() {
		EntityManager entityManager = getEntityManager();
		user = getSessionUser(entityManager);
		if (user == null) {
			addActionError("Zaloguj się");
			entityManager.close();
			return LOGIN;
		}
		EntityTransaction transaction = entityManager.getTransaction();
		transaction.begin();
		Item item = getSelectedUserItem();
		if (item == null) {
			addActionError("Nie znaleziono wskazanego przedmiotu!");
			transaction.rollback();
			return ERROR;
		}
		if (item.isInUse()) {
			item.setInUse(false);
			checkOtherItems(entityManager);
		} else {
			if (canBeEquiped(item)) {
				item.setInUse(true);
			} else {
				addActionError("Nie możesz założyc tego przedmiotu, gdyż nie spełniasz jego wymagań "
						+ "lub twoja postac wyposażona jest w ekwipunek uniemożliwiający używanie tego przedmiotu");
				transaction.rollback();
				return ERROR;
			}
		}
		entityManager.merge(item);
		entityManager.flush();
		transaction.commit();
		entityManager.close();
		return SUCCESS;
	}

	private void checkOtherItems(EntityManager entityManager) {
		for (Item item : user.getItems()) {
			if(item.isInUse() && !ItemUtil.matchesItemRequirements(user, item)){
				item.setInUse(false);
				entityManager.merge(item);
			}
		}
	}

	private boolean canBeEquiped(Item item) {
		if (ItemUtil.matchesItemRequirements(user, item)
				&& ItemUtil.canEquipItemType(user, item.getType())
				&& ItemUtil.equipingNotBlockedByOtherItem(user, item)) {
			return true;
		}
		return false;
	}

	private Item getSelectedUserItem() {
		List<Item> items = user.getItems();
		for (Item item : items) {
			if (item.getId() == itemId) {
				return item;
			}
		}
		return null;
	}

	public long getItemId() {
		return itemId;
	}

	public void setItemId(long itemId) {
		this.itemId = itemId;
	}

}
